#include "BrazoGrua.h"

#include <glm\gtc\matrix_transform.hpp>


BrazoGrua::BrazoGrua(unsigned int cantBloques) : m_cantBloques(cantBloques)
{
}


void BrazoGrua::init(const glm::vec3 &posFuenteLuzDireccional, std::string vertShaderFileName, std::string fragShaderFileName) {
	this->m_cubo.init(posFuenteLuzDireccional, vertShaderFileName, fragShaderFileName);
	this->m_bloque.init(posFuenteLuzDireccional, vertShaderFileName, fragShaderFileName);
}


void BrazoGrua::setMaterial(const glm::vec3 &coefDifusion, const glm::vec3 &coefAmbiente, const glm::vec3 &coefEspecular) {
	this->m_cubo.setMaterial(coefDifusion, coefAmbiente, coefEspecular);
	this->m_bloque.setMaterial(coefDifusion, coefAmbiente, coefEspecular);
}


void BrazoGrua::renderizar(const glm::mat4 &matVista, const glm::mat4 &matProyeccion, const glm::mat4 &matModelo) const {
	// Permite que la estructura quede centrada a 1/3 del borde en el origen
	const float centro = static_cast<float>( this->m_cantBloques * ( 2.0f/3.0f ) );
	glm::mat4 matCenta = glm::translate(matModelo, glm::vec3(0.0f, centro, 0.0f));

	// El brazo de la grua es mas delgado y debe estar horizontal
	glm::mat4 modelMat = glm::rotate(matCenta, 90.0f, glm::vec3(1.0f, 0.0f, 0.0f));
	modelMat = glm::scale(modelMat, glm::vec3(0.5f, 0.5f, 0.5f));

	for (unsigned int i = 0; i < this->m_cantBloques; ++i){
		glm::mat4 matTrans = glm::translate(modelMat, glm::vec3(0.0f, 0.0f, 2.0f * i));
		this->m_bloque.renderizar(matVista, matProyeccion, matTrans);
	}

	// Coloca el contra-peso en un extremo del brazo
	const float posContraPeso = (-1.0f * this->m_cantBloques) - 0.1f;
	glm::mat4 matContraPeso = glm::translate(matCenta, glm::vec3(0.0f, posContraPeso, 0.0f));
	this->m_cubo.renderizar(matVista, matProyeccion, matContraPeso);

	// La cabina debe estar en el centro
	glm::mat4 matCabina = glm::scale(matModelo, glm::vec3(1.3f, 1.3f, 0.8f));
	this->m_cubo.renderizar(matVista, matProyeccion, matCabina);
}


